									  /*
**************************************************************************************************************
*                                        QPBOC辅助函数	
*
*  描 述： QPBOC辅助函数
*
*  配 置： 
*
*  注 意：  
*
*  作 者： 
*
*  版 本： V1.0     
*
*  日 期： 2010-06-30
*
*        Copyright (c) 2008-2009   Brand-NEW C.A.P Electronics Technology CO.,LTD
*
**************************************************************************************************************
*/

#include "..\..\Prj\INC\LIB_Includes.H"



/*
**************************************************************************************************************
*										         常 量
**************************************************************************************************************
*/

/*
**************************************************************************************************************
*										         类 型
**************************************************************************************************************
*/

/*
**************************************************************************************************************
*										         类 型
**************************************************************************************************************
*/

/*
**************************************************************************************************************
*										         变 量
**************************************************************************************************************
*/

/*
**************************************************************************************************************
*         								         函 数
**************************************************************************************************************
*/
/*
**************************************************************************************************************
* 函数功能：银联系统参数初始化　包括参数区的打开	 需要之前已经配置过银联参数区基本参数
* 函数输入：mode	bit0 是否进行记录及参数区的打开检测	 0:否　1:是
*       			bit1 是否每天生成一条签到签退记录	 0:是　1:否
					bit2 单商户多商户选择	 			 0:单商户　1:多商户
* 函数输出：无
*
* 函数返回：0：成功
			1：失败
*   
**************************************************************************************************************
*/
U32 UP_Par_Init(U32 mode)
{
	U08 buf_8byte[4];
	U32 rcode = 0;
	UP_Mode = mode;
	if(mode&1)
	{
		rcode = APP_Open_RecFile( UP_Rec_Config.UP_RecMemoryBank_Trade );			//qPBOC消费记录
		if( rcode != 0 )
		{ goto END; }
		rcode = APP_Open_RecFile( UP_Rec_Config.UP_RecMemoryBank_ErrTrade );		//qPBOC消费纠错
		if( rcode != 0 )
		{ goto END; }
		rcode = APP_Open_RecFile( UP_Rec_Config.UP_RecMemoryBank_CAPubKey );		//CA公钥
		if( rcode != 0 )
		{ goto END; }
		rcode = APP_Open_RecFile( UP_Rec_Config.UP_RecMemoryBank_ICPar );			//IC卡参数
		if( rcode != 0 )
		{ goto END; }
		rcode = APP_Open_RecFile( UP_Rec_Config.UP_RecMemoryBank_TradeRec );		//qPBOC消费记录上传返回信息
		if( rcode != 0 )
		{ goto END; }
		rcode = UP_Open_TlvCfg();
		if(rcode)
		{goto END;}
		rcode = UP_Read_TlvCfg( &UP_PosTLVSet );
		if(rcode)
		{goto END;}
		rcode = UP_Open_SysCfg();
		if(rcode)
		{goto END;}
		rcode = UP_Read_SysCfg( &UP_SysCfg );
		if(rcode)
		{goto END;}
		rcode = UP_Open_ComCfg();
		if(rcode)
		{goto END;}
		rcode = UP_Read_ComCfg( &UP_CommStatPar );
		if(rcode)
		{goto END;}
	}
	rcode = UP_CAKeyAndICPar_Load();
	if(rcode)
	{goto END;}
	buf_8byte[0] = SYS_RTC_Time.Year_H;
    buf_8byte[1] = SYS_RTC_Time.Year_L;
    buf_8byte[2] = SYS_RTC_Time.Month;
    buf_8byte[3] = SYS_RTC_Time.Day;
	if( ((mode&2)==0)&&( UP_SysCfg.QDState != 0 ) && ( memcmp( buf_8byte+2,UP_SysCfg.QDTime+2,2 ) != 0 ) )
	{												  					//已经签到，并且非同一天
		UP_SysCfg.QDTime[0] = SYS_RTC_Time.Year_H;
	    UP_SysCfg.QDTime[1] = SYS_RTC_Time.Year_L;
	    UP_SysCfg.QDTime[2] = SYS_RTC_Time.Month;
	    UP_SysCfg.QDTime[3] = SYS_RTC_Time.Day;
		UP_SysCfg.QDTime[4] = SYS_RTC_Time.Hour;
	    UP_SysCfg.QDTime[5] = SYS_RTC_Time.Minute;
	    UP_SysCfg.QDTime[6] = SYS_RTC_Time.Second;
		UP_Save_ECSysCfg();
		rcode = UP_HookQTQDWriteRec();
		if( rcode != 0 )
		{ goto END; }
	}
	END:
	return rcode;
}
   
/*
**************************************************************************************************************
* 【2】                                       配置银联通信基本参数
*
*  描  述：
*
*  参  数：	U32	ComType,					 	通信类型
			U08	WiComBaud,						通信波特率
			U32 WiComConnectTimeOut,		 	连接服务器超时时间
			U32	WiComTxTimeOut,				 	发送数据超时时间
			U32	WiComRxTimeOut				 	接收数据超时时间
			U08 WiComInitStat					APN切换时是否重启通信模块　0:不重启，1:重启
* 
*  返  回：
**************************************************************************************************************
*/							  
void UP_Comm_Configuration(	U08	ComType,	  
							U32	WiComBaud,
							U32 WiComConnectTimeOut,
							U32	WiComTxTimeOut,
							U32	WiComRxTimeOut,
							U08 WiComInitStat)
{
	UP_Comm_Config.WiComConnectTimeOut = WiComConnectTimeOut;
	UP_Comm_Config.WiComTxTimeOut = WiComTxTimeOut;
	UP_Comm_Config.WiComRxTimeOut = WiComRxTimeOut;
	UP_Comm_Config.WiComBaud = WiComBaud;
	UP_Comm_Config.ComType = ComType;
	UP_Comm_Config.WiComInitStat = WiComInitStat;	//APN切换时是否重启通信模块　0:不重启，1:重启
}	

/*
**************************************************************************************************************
* 【2】                                       配置银联记录区基本参数
*
*  描  述：
*
*  参  数：	U32	UP_CAPubKey_Id,				公钥记录存储区号
			U08	UP_ICPar_Id,					IC卡参数记录存储区号 
			U32 UP_Trade_Id,		 			消费记录存储区号
			U32	UP_ErrTrade_Id,				消费异常记录区号
			
* 
*  返  回：
**************************************************************************************************************
*/							  
void UP_Rec_Configuration(	U32	UP_CAPubKey_Id,
							U32 UP_ICPar_Id,
							U32	UP_Trade_Id,
							U32	UP_ErrTrade_Id,
							U32	UP_TradeRec_Id )
{
	UP_Rec_Config.UP_RecMemoryBank_CAPubKey = UP_CAPubKey_Id;
	UP_Rec_Config.UP_RecMemoryBank_ICPar = UP_ICPar_Id;
	UP_Rec_Config.UP_RecMemoryBank_Trade = UP_Trade_Id;
	UP_Rec_Config.UP_RecMemoryBank_ErrTrade = UP_ErrTrade_Id;
	UP_Rec_Config.UP_RecMemoryBank_TradeRec = UP_TradeRec_Id;
}	
/*
**************************************************************************************************************
* 【2】                                       配置银联参数区基本参数
*
*  描  述：
*
*  参  数：	U32	UP_PosTlv,				高８位：存储器类型	0:FLASH 1:FRAM		低２４位：ＴＬＶ参数存储区号
			U08	UP_SysCfg,				高８位：存储器类型	0:FLASH 1:FRAM		低２４位：系统参数IC卡参数记录存储区号 
			U32 UP_ComStat,		 		高８位：存储器类型	0:FLASH 1:FRAM		低２４位：通信参数存储区号
			
* 
*  返  回：
**************************************************************************************************************
*/							  
void UP_Par_Configuration(	U32	UP_PosTlv,
							U32 UP_SysCfg,
							U32	UP_ComStat)
{
	UP_Par_Config.UP_Par_PosTlv = UP_PosTlv;
	UP_Par_Config.UP_Par_SysCfg = UP_SysCfg;
	UP_Par_Config.UP_Par_ComStat = UP_ComStat;
}	
/*
**************************************************************************************************************
* 【2】                                       配置银联记录返回信息标识
*
*  描  述：
*
*  参  数：	U32		Type;	0:保存后不删除返回信息　　1：保存后删除返回信息　
*  返  回：
**************************************************************************************************************
*/							  
void UP_Rec_RetInfo( U32 Type )
{
	UP_RetInfo = Type;
}

/*
**************************************************************************************************************
* 【2】                                       配置银联PICC 标识
*
*  描  述：
*
*  参  数：	U32		Icc;	//PICC 标识
*  返  回：
**************************************************************************************************************
*/							  
void UP_Icc_Configuration(	U32 Icc)
{
	UP_Icc = Icc;
}
/*
**************************************************************************************************************
*  描  述：	配置银联扩展交易参数
*  参  数：	ExtTradeInformation	银联扩展交易参数，具体含义请参考结构体原型中说明
*  返  回：
**************************************************************************************************************
*/							  
void UP_ExtTrade_Configuration(	__UP_ExtTradeInformation *ExtTradeInformation)
{
	memcpy(&UP_ExtTradeInformation,ExtTradeInformation,sizeof(__UP_ExtTradeInformation));
}
/*
**************************************************************************************************************        
保存系统参数
**************************************************************************************************************
*/
void UP_Save_ECSysCfg( void )
{
	if( UP_Write_SysCfg( &UP_SysCfg ) != 0 )
	{
		UP_Read_SysCfg( &UP_SysCfg );
	}
} 
/*
**************************************************************************************************************
*                                        创建银联TLV参数
*  描  述：
*  参  数：
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/		
U32 UP_Create_TlvCfg( void )
{
	U32 rcode = 1;
	if((UP_Par_Config.UP_Par_PosTlv&0xFF000000)==0)
	{
		rcode = APP_Create_UseFile( UP_Par_Config.UP_Par_PosTlv&0x00FFFFFF, sizeof(__UP_PosTLVSet) );
	}
	else if((UP_Par_Config.UP_Par_PosTlv&0xFF000000)==0x01000000)
	{
		rcode = 0;
	}
	return rcode;	
}
/*
**************************************************************************************************************
*                                        打开银联TLV参数
*  描  述：
*  参  数：
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/		
U32 UP_Open_TlvCfg( void )
{
	U32 rcode = 1;
	if((UP_Par_Config.UP_Par_PosTlv&0xFF000000)==0)
	{
		rcode = APP_Open_UseFile( UP_Par_Config.UP_Par_PosTlv&0x00FFFFFF, sizeof(__UP_PosTLVSet) );
	}
	else if((UP_Par_Config.UP_Par_PosTlv&0xFF000000)==0x01000000)
	{
		rcode = 0;
	}
	return rcode;	
}
/*
**************************************************************************************************************
*                                        读取银联TLV参数
*  描  述：
*  参  数：UP_PosTLVSet	   TLV参数
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/		
U32 UP_Read_TlvCfg( __UP_PosTLVSet *PosTLVSet )
{
	U32 rcode = 1;
	if((UP_Par_Config.UP_Par_PosTlv&0xFF000000)==0)
	{
		rcode = APP_Read_UseFile( UP_Par_Config.UP_Par_PosTlv&0x00FFFFFF, (U08*)PosTLVSet, sizeof(__UP_PosTLVSet) );
	}
	else if((UP_Par_Config.UP_Par_PosTlv&0xFF000000)==0x01000000)
	{
		rcode = APP_Read_SysFile( UP_Par_Config.UP_Par_PosTlv&0x00FFFFFF, (U08*)PosTLVSet, sizeof(__UP_PosTLVSet) );
	}
	if(rcode == 0)
	{
		memmove(&UP_PosTLVSet, PosTLVSet, sizeof(__UP_PosTLVSet));
	}
	return rcode;	
}
/*
**************************************************************************************************************
*                                        存储银联TLV参数
*  描  述：
*  参  数：UP_PosTLVSet	   TLV参数
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Write_TlvCfg( __UP_PosTLVSet *PosTLVSet )
{	
	U32 rcode = 1;
	memmove(&UP_PosTLVSet, PosTLVSet, sizeof(__UP_PosTLVSet));
	if((UP_Par_Config.UP_Par_PosTlv&0xFF000000)==0)
	{
		rcode = APP_Write_UseFile( UP_Par_Config.UP_Par_PosTlv&0x00FFFFFF, (U08*)PosTLVSet, sizeof(__UP_PosTLVSet) );
	}
	else if((UP_Par_Config.UP_Par_PosTlv&0xFF000000)==0x01000000)
	{
		rcode = APP_Write_SysFile( UP_Par_Config.UP_Par_PosTlv&0x00FFFFFF, (U08*)PosTLVSet, sizeof(__UP_PosTLVSet) );
	}
	if(rcode)
	{UP_Read_TlvCfg( &UP_PosTLVSet );}
	return rcode;
} 
/*
**************************************************************************************************************
*                                        创建银联系统参数
*  描  述：
*  参  数：
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Create_SysCfg( void )
{
	U32 rcode = 1;
	if((UP_Par_Config.UP_Par_SysCfg&0xFF000000)==0)
	{
		rcode = APP_Create_UseFile( UP_Par_Config.UP_Par_SysCfg&0x00FFFFFF, sizeof(__UP_SystemConfig) );
	}
	else if((UP_Par_Config.UP_Par_SysCfg&0xFF000000)==0x01000000)
	{
		rcode = 0;
	}
	return rcode;	
}
 /*
**************************************************************************************************************
*                                        打开银联系统参数
*  描  述：
*  参  数：
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Open_SysCfg( void )
{
	U32 rcode = 1;
	if((UP_Par_Config.UP_Par_SysCfg&0xFF000000)==0)
	{
		rcode = APP_Open_UseFile( UP_Par_Config.UP_Par_SysCfg&0x00FFFFFF, sizeof(__UP_SystemConfig) );
	}
	else if((UP_Par_Config.UP_Par_SysCfg&0xF000000)==0x01000000)
	{
		rcode = 0;
	}
	return rcode;	
}
/*
**************************************************************************************************************
*                                        读取银联系统参数
*  描  述：
*  参  数：UP_SysCfg	   系统参数
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Read_SysCfg( __UP_SystemConfig *SysCfg )
{
	U32 rcode = 1;
	if((UP_Par_Config.UP_Par_SysCfg&0xFF000000)==0)
	{
		rcode = APP_Read_UseFile( UP_Par_Config.UP_Par_SysCfg&0x00FFFFFF, (U08*)SysCfg, sizeof(__UP_SystemConfig) );
	}
	else if((UP_Par_Config.UP_Par_SysCfg&0xFF000000)==0x01000000)
	{
		rcode = APP_Read_SysFile( UP_Par_Config.UP_Par_SysCfg&0x00FFFFFF, (U08*)SysCfg, sizeof(__UP_SystemConfig) );
	}
	if(rcode == 0)
	{
		memmove(&UP_SysCfg, SysCfg, sizeof(__UP_SystemConfig));
	}
	return rcode;	
}
/*
**************************************************************************************************************
*                                        存储银联系统参数
*  描  述：
*  参  数：UP_SysCfg	   系统参数
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Write_SysCfg( __UP_SystemConfig *SysCfg )
{
	U32 rcode = 1;
	memmove(&UP_SysCfg, SysCfg, sizeof(__UP_SystemConfig));
	if((UP_Par_Config.UP_Par_SysCfg&0xFF000000)==0)
	{
		rcode = APP_Write_UseFile( UP_Par_Config.UP_Par_SysCfg&0x00FFFFFF, (U08*)SysCfg, sizeof(__UP_SystemConfig) );
	}
	else if((UP_Par_Config.UP_Par_SysCfg&0xFF000000)==0x01000000)
	{
		rcode = APP_Write_SysFile( UP_Par_Config.UP_Par_SysCfg&0x00FFFFFF, (U08*)SysCfg, sizeof(__UP_SystemConfig) );
	}
	if(rcode)
	{UP_Read_SysCfg( &UP_SysCfg );}
	return rcode;	
}  
/*
**************************************************************************************************************
*                                        创建银联Com参数
*  描  述：
*  参  数：
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Create_ComCfg( void )
{
	U32 rcode = 1;
	if((UP_Par_Config.UP_Par_ComStat&0xFF000000)==0)
	{
		rcode = APP_Create_UseFile( UP_Par_Config.UP_Par_ComStat&0x00FFFFFF, sizeof(__UP_CommStatPar) );
	}
	else if((UP_Par_Config.UP_Par_ComStat&0xFF000000)==0x01000000)
	{
		rcode = 0;
	}
	return rcode;	
}
/*
**************************************************************************************************************
*                                        打开银联Com参数
*  描  述：
*  参  数：
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Open_ComCfg( void )
{
	U32 rcode = 1;
	if((UP_Par_Config.UP_Par_ComStat&0xFF000000)==0)
	{
		rcode = APP_Open_UseFile( UP_Par_Config.UP_Par_ComStat&0x00FFFFFF, sizeof(__UP_CommStatPar) );
	}
	else if((UP_Par_Config.UP_Par_ComStat&0xFF000000)==0x01000000)
	{
		rcode = 0;
	}
	return rcode;	
}
/*
**************************************************************************************************************
*                                        读取银联Com参数
*  描  述：
*  参  数：UP_CommStatPar	   Com参数
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Read_ComCfg( __UP_CommStatPar *CommStatPar )
{
	U32 rcode = 1;
	if((UP_Par_Config.UP_Par_ComStat&0xFF000000)==0)
	{
		rcode = APP_Read_UseFile( UP_Par_Config.UP_Par_ComStat&0x00FFFFFF, (U08*)CommStatPar, sizeof(__UP_CommStatPar) );
	}
	else if((UP_Par_Config.UP_Par_ComStat&0xFF000000)==0x01000000)
	{
		rcode = APP_Read_SysFile( UP_Par_Config.UP_Par_ComStat&0x00FFFFFF, (U08*)CommStatPar, sizeof(__UP_CommStatPar) );
	}
	if(rcode == 0)
	{
		memmove((U08*)&UP_CommStatPar, CommStatPar, sizeof(__UP_CommStatPar));
	}
	return rcode;	
}
/*
**************************************************************************************************************
*                                        存储银联Com参数
*  描  述：
*  参  数：UP_CommStatPar	   Com参数
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Write_ComCfg( __UP_CommStatPar *CommStatPar )
{
	U32 rcode = 1;
	memmove((U08*)&UP_CommStatPar, CommStatPar, sizeof(__UP_CommStatPar));
	if((UP_Par_Config.UP_Par_ComStat&0xFF000000)==0)
	{
		rcode = APP_Write_UseFile( UP_Par_Config.UP_Par_ComStat&0x00FFFFFF, (U08*)CommStatPar, sizeof(__UP_CommStatPar) );
	}
	else if((UP_Par_Config.UP_Par_ComStat&0xFF000000)==0x01000000)
	{
		rcode = APP_Write_SysFile( UP_Par_Config.UP_Par_ComStat&0x00FFFFFF, (U08*)CommStatPar, sizeof(__UP_CommStatPar) );
	}
	if(rcode)
	{UP_Read_ComCfg( &UP_CommStatPar );}
	return rcode;	
}
/*
**************************************************************************************************************
*                                        存储银联临时终端编号
*  描  述：
*  参  数：PosNum	   银联临时终端编号
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Write_PosNum( U08 *PosNum )
{
	U32 rcode = 0;
	U32	setsize = 8;
	if(memcmp(UP_SysCfg.aTVL9F1CData, PosNum, setsize)!=0)
	{
		memcpy(UP_SysCfg.aTVL9F1CData, PosNum, setsize);
		rcode = UP_Write_SysCfg( &UP_SysCfg );
	}
	return rcode;	
}
/*
**************************************************************************************************************
*                                        存储银联临时商户编号  
*  描  述：
*  参  数：ManageNum	   银联临时商户编号
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Write_ManageNum( U08 *ManageNum )
{
	U32 rcode = 0;
	U32	setsize = 15;
	if(memcmp(UP_SysCfg.aTVL9F16Data, ManageNum, setsize)!=0)
	{
		memcpy(UP_SysCfg.aTVL9F16Data, ManageNum, setsize);  
		rcode = UP_Write_SysCfg( &UP_SysCfg );
	}
	return rcode;	
}
/*
**************************************************************************************************************
*                                        存储银联商户编号、终端编号、通信主密钥
*  描  述：	  
*  参  数：	ManageNum  	银联商户编号
			PosNum	   	银联终端编号
			Kek	   		银联通信主密钥

*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/		
U32 UP_Write_ComMainKek( U08 *ManageNum, U08 *PosNum, U08 *Kek )
{
	U32 rcode = 0;
	UP_SysCfg.TVL9F1CDataStat = 0;
	UP_SysCfg.TVL9F16DataStat = 0;
	rcode = UP_Write_SysCfg( &UP_SysCfg );
	if(rcode)
	{goto END;}		
	memcpy(UP_CommStatPar.aTVL9F16Data, ManageNum, 15);
	memcpy(UP_CommStatPar.aTVL9F1CData, PosNum, 8);
	memcpy(UP_CommStatPar.aKey,Kek,16);
	rcode = UP_Write_ComCfg( &UP_CommStatPar );
	if(rcode)
	{goto END;}
	if(( UP_SysCfg.QDTime[7] == 0 )||((UP_Mode&UP_MODE_MANGEM)==0))	//第一次使用   或 单商户
	{		
		UP_SysCfg.QDTime[7] = 1;
		memcpy( UP_PosTLVSet.TVL9F16Data, UP_CommStatPar.aTVL9F16Data, 15 );
		memcpy( UP_PosTLVSet.TVL9F1CData, UP_CommStatPar.aTVL9F1CData, 8 );
		memcpy( UP_SysCfg.Key, UP_CommStatPar.aKey, 16 );
		rcode = UP_Write_TlvCfg( &UP_PosTLVSet );
		if(rcode)
		{goto END;}
	}
	UP_SysCfg.TVL9F1CDataStat = 1;
	UP_SysCfg.TVL9F16DataStat = 1;
	UP_SysCfg.Key_MainStat = 1;
	rcode = UP_Write_SysCfg( &UP_SysCfg );
	if(rcode)
	{goto END;}
	rcode = UP_HookQTQDWriteRec();
	END:
	return rcode;	
}
/*
**************************************************************************************************************
*                                        获取银联临时终端编号
*  描  述：
*  参  数：PosNum	   银联临时终端编号
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Read_PosNum( U08 *PosNum )
{
	U32 rcode = 0;
	rcode = UP_Read_SysCfg( &UP_SysCfg );
	if(rcode==0)
	{
		memcpy(PosNum, UP_SysCfg.aTVL9F1CData, 8);
	}
	return rcode;	
}
/*
**************************************************************************************************************
*                                        获取银联临时商户编号
*  描  述：
*  参  数：ManageNum	   银联临时商户编号
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Read_ManageNum( U08 *ManageNum )
{
	U32 rcode = 0;
	rcode = UP_Read_SysCfg( &UP_SysCfg );
	if(rcode==0)
	{
		memcpy(ManageNum, UP_SysCfg.aTVL9F16Data, 15);
	}
	return rcode;	
}
/*
**************************************************************************************************************
*                                        获取银联通信主密钥
*  描  述：
*  参  数：Kek	   银联通信主密钥
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Read_ComMainKek( U08 *Kek )
{
	U32 rcode = 0;
	rcode = UP_Read_ComCfg( &UP_CommStatPar );
	if(rcode)
	{goto END;}
	memcpy(Kek,UP_CommStatPar.aKey,16);
	END:
	return rcode;	
}
/*
**************************************************************************************************************
*                                        存储银联参数版本
*  描  述：
*  参  数：	Index	0:	公钥版本			UP_CAKEY_INDEX
					1:	IC卡参数版本		UP_ICPAR_INDEX
					2:	其它所有参数版本	UP_PAR_INDEX
			Ver	   	银联参数版本
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Write_Ver( U32 Index, U32 Ver )
{
	U32 rcode = 0;
	if(Index == UP_CAKEY_INDEX)
	{UP_SysCfg.CAKeyVer = Ver;}
	else if(Index == UP_ICPAR_INDEX)
	{UP_SysCfg.ICParVer = Ver;}
	else if(Index == UP_PAR_INDEX)
	{UP_SysCfg.ParVer = Ver;}
	
	rcode = UP_Write_SysCfg( &UP_SysCfg );
	return rcode;	
}
/*
**************************************************************************************************************
*                                        获取银联参数版本
*  描  述：
*  参  数：	Index	0:	公钥版本			UP_CAKEY_INDEX
					1:	IC卡参数版本		UP_ICPAR_INDEX
					2:	其它所有参数版本	UP_PAR_INDEX
			Ver	   	银联参数版本
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Read_Ver( U32 Index, U32 *Ver )
{
	U32 rcode = 0;
	rcode = UP_Read_SysCfg( &UP_SysCfg );
	if(rcode)
	{goto END;}
	if(Index == UP_CAKEY_INDEX)
	{*Ver = UP_SysCfg.CAKeyVer;}
	else if(Index == UP_ICPAR_INDEX)
	{*Ver = UP_SysCfg.ICParVer;}
	else if(Index == UP_PAR_INDEX)
	{*Ver = UP_SysCfg.ParVer;}
	END:
	return rcode;	
}
/*
**************************************************************************************************************
*                                        存储银联公钥或IC卡参数状态
*  描  述：
*  参  数：	Index	0:	公钥版本			UP_CAKEY_INDEX
					1:	IC卡参数版本		UP_ICPAR_INDEX
			Stat	银联公钥或IC卡参数状态	0:已下载	1:未下载
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Write_CAKeyOrICParStat( U32 Index, U32 Stat )
{
	U32 rcode = 0;
	if(Stat == 0)
	{UP_SysCfg.CAPKeyAndICParmSta &= ~(1<<Index);}
	else
	{UP_SysCfg.CAPKeyAndICParmSta |= (1<<Index);}
	
	rcode = UP_Write_SysCfg( &UP_SysCfg );
	return rcode;	
}
/*
**************************************************************************************************************
*                                        获取银联公钥或IC卡参数状态
*  描  述：
*  参  数：	Index	0:	公钥版本			UP_CAKEY_INDEX
					1:	IC卡参数版本		UP_ICPAR_INDEX
			Stat	银联公钥或IC卡参数状态	0:已下载	1:未下载
*  返  回：	0：成功
			非0：失败
**************************************************************************************************************
*/	
U32 UP_Read_CAKeyOrICParStat( U32 Index, U32 *Stat )
{
	U32 rcode = 0;
	rcode = UP_Read_SysCfg( &UP_SysCfg );
	if(rcode)
	{goto END;}
	if(Index == UP_CAKEY_INDEX)
	{*Stat = ((UP_SysCfg.CAPKeyAndICParmSta&1)>0);}
	else if(Index == UP_ICPAR_INDEX)
	{*Stat = ((UP_SysCfg.CAPKeyAndICParmSta&2)>0);}
	END:
	return rcode;	
}

